{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1e8f64b5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "HumanMessage(content=\"Person A: Hey, have you been following the news lately? The tensions between countries seem to be escalating.\\n\\nPerson B: Yes, it's quite concerning. World peace seems like a distant dream sometimes. Don't you think so?\\n\\nTranslation:\\nA: 你最近关注新闻了吗？国家间的紧张局势似乎在升级。\\n\\nB: 是的，有时候真的觉得世界和平遥不可及。你不这么认为吗？\\n\\nComment: In this part, Person A is bringing up the current state of international relations, which is a common topic when discussing world peace.\\n\\nPerson A: I agree. It's crucial for nations to find ways to communicate and cooperate, rather than resorting to conflict.\\n\\nPerson B: Absolutely. Diplomacy and understanding are key. We need to remember that we're all human beings, sharing the same planet.\\n\\nTranslation:\\nA: 我同意。各国应该寻求沟通和合作，而不是诉诸冲突。\\n\\nB: 完全正确。外交和理解至关重要。我们不能忘记，我们都是地球上的同类。\\n\\nComment: Person A emphasizes the importance of diplomacy, while Person B highlights the need for empathy and unity.\\n\\nPerson A: And promoting education about different cultures and perspectives can go a long way in fostering peace.\\n\\nPerson B: That's a great point. Knowledge and empathy can break down barriers and create a more harmonious world.\\n\\nTranslation:\\nA: 推广不同文化与观点的教育对于促进和平有很大帮助。\\n\\nB: 你说得对。知识和同理心能打破隔阂，构建一个更和谐的世界。\\n\\nComment: Both individuals are suggesting that education and understanding can be powerful tools in the pursuit of world peace.\", response_metadata={'token_usage': {'completion_tokens': 338, 'prompt_tokens': 38, 'total_tokens': 376, 'elapsed_time': 54.388754, 'tokens_per_second': 6.214520009044517}, 'model_name': 'qwen1.5-14b', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-b4ad1a42-175b-4e72-94a0-4fff295e7c55-0')\n"
     ]
    }
   ],
   "source": [
    "# from langchain_community.llms import Ollama\n",
    "# llm = Ollama(base_url='http://localhost:11434', model=\"qwen:0.5b\")\n",
    "\n",
    "from langchain_openai import ChatOpenAI\n",
    "from pprint import pprint\n",
    "\n",
    "llm = ChatOpenAI(api_key=\"denglin-triton-server\",\n",
    "                 model=\"qwen1.5-14b\",\n",
    "                 max_tokens=2500, # 目前模型最大上下文长度为4096，回答设置为3/5即大约2500\n",
    "                 temperature=0.1,\n",
    "                 streaming=False,\n",
    "                 base_url=\"http://172.16.64.139:5100/v1\")\n",
    "\n",
    "# llm = ChatOpenAI(api_key=\"sk-ec9798f09124490d8b3578922685cba7\",\n",
    "#                  model=\"qwen-turbo\",\n",
    "#                  base_url=\"https://dashscope.aliyuncs.com/compatible-mode/v1\")\n",
    "\n",
    "messages = [\n",
    "        {\"role\":\"system\",\"content\":\"You are a helpful assistant.\"}, \n",
    "        {\"role\":\"user\",\"content\":\"用英文模拟两个人关于世界和平的对话，添加必要的翻译和注释\"}\n",
    "    ]\n",
    "response = llm.invoke(messages)\n",
    "pprint(response)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "1371af22-3bf6-4940-9e51-b02a7daf7b48",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "prompt = ChatPromptTemplate.from_messages([\n",
    "    (\"system\", \"You are a world class technical documentation writer.\"),\n",
    "    (\"user\", \"{input}\")\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "3e52de19-5465-455d-ae21-1c1989723519",
   "metadata": {},
   "outputs": [],
   "source": [
    "chain = prompt | llm "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "bd48c432-7c4e-4bb3-9b62-1cbf7d9f3ee2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'langchain是一个由langchain-lc和langchain-cm联合开发的框架。该框架旨在简化和优化语言编译器的过程。\\n\\nlangchain主要的功能包括：\\n\\n1. 编译器参数：例如，参数`--help`会显示编译器的一些信息。\\n\\n2. 语言特性：例如，语法特性`-c``-v``-i``-d``-a``-o``-s``-w``-x``-y``-z``-a``-b`-c`-d`-e`-f\\n\\n3. 语言特性与编译器参数的组合：例如，语法特性`-c``-v``-i``-d``-a``-o``-s``-w``-x``-y``-z``-a``-b`-c`-d`-e`-f\\n\\n4. 语言特性与编译器参数的组合：例如，语法特性`-c``-v``-i``-d``-a``-o``-s``-w``-x``-y``-z``-a``-b`-c`-d`-e`-f'"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\": \"介绍一下langchain框架?\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "69c8f994-1d77-47d4-bebb-9a6d2f005b53",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_core.output_parsers import StrOutputParser\n",
    "\n",
    "output_parser = StrOutputParser()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "d9fca573-3d81-4eaf-895e-8861f4525d80",
   "metadata": {},
   "outputs": [],
   "source": [
    "chain = prompt | llm | output_parser"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "fa4d016b-a681-4cf8-822c-a3693f381f72",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Spring Boot框架是一个基于Java的，可以动态配置的架构。它使用了Spring MVC作为它的核心框架，因此整个系统的性能都得到了提升。'"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\": \"介绍一下springboot框架?\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "d596c741-c0b3-4d68-b06a-ee5a92dd4e05",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import WebBaseLoader\n",
    "loader = WebBaseLoader(\"https://platform.moonshot.cn/docs/intro\")\n",
    "\n",
    "docs = loader.load()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "39af903e-6224-470e-99cd-aeec8c0dacd5",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.embeddings import OllamaEmbeddings\n",
    "\n",
    "embeddings = OllamaEmbeddings(base_url='http://localhost:11434', model=\"herald/dmeta-embedding-zh:latest\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "ce5ac01c-e84f-4f3b-80b9-986fe1931e5a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.vectorstores import FAISS\n",
    "from langchain_text_splitters import RecursiveCharacterTextSplitter\n",
    "\n",
    "\n",
    "text_splitter = RecursiveCharacterTextSplitter()\n",
    "documents = text_splitter.split_documents(docs)\n",
    "vector = FAISS.from_documents(documents, embeddings)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "c2247600-b5de-4bab-989b-dd23c9346df9",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.chains.combine_documents import create_stuff_documents_chain\n",
    "\n",
    "prompt = ChatPromptTemplate.from_template(\"\"\"\n",
    "上下文信息如下：\n",
    "{context}\n",
    "\n",
    "请根据上下文信息而不是先验知识回答以下的问题。作为一个技术专家，你的回答要尽可能严谨\n",
    "\n",
    "问题: {input}\n",
    "\"\"\")\n",
    "\n",
    "document_chain = create_stuff_documents_chain(llm, prompt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "d36951de-9413-4850-ada2-0f447cca5eae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Document(page_content='Moonshot AI 开放平台文档文档用户中心用户中心 (opens in a new tab)使用手册API 文档ChatTool UsePartial Mode文件接口其它产品定价相关链接Moonshot ↗ (opens in a new tab)Blog ↗ (opens in a new tab)Light目录主要概念文本生成模型语言模型推理服务Token速率限制模型列表使用指南获取 API 密钥发送请求处理响应常见问题指南如何获得更好的输出？回到顶部文档使用手册主要概念\\n文本生成模型\\nMoonshot的文本生成模型（指moonshot-v1）是训练用于理解自然语言和书面语言的，它可以根据输入生成文本输出。对模型的输入也被称为“prompt”。通常我们建议您提供明确的指令以及给出一些范例，来让模型能够完成既定的任务，设计 prompt 本质上就是学会如何“训练”模型。moonshot-v1模型可以用于各种任务，包括内容或代码生成、摘要、对话、创意写作等。\\n语言模型推理服务\\n语言模型推理服务是一个基于我们 (Moonshot AI) 开发和训练的预训练模型的 API 服务。在设计上，我们对外主要提供了一个 Chat Completions 接口，它可以用于生成文本，但是它本身是不支持访问网络、数据库等外部资源，也不支持执行任何代码。\\nToken\\n文本生成模型以 Token 为基本单位来处理文本。Token 代表常见的字符序列。例如，单个汉字\"夔\"可能会被分解为若干 Token 的组合，而像\"中国\"这样短且常见的短语则可能会使用单个 Token。大致来说，对于一段通常的中文文本，1 个 Token 大约相当于 1.5-2 个汉字。\\n需要注意的是，对于我们的文本模型，Input 和 Output 的总和长度不能超过模型的最大上下文长度。\\n速率限制\\n这些速率限制是如何工作的？\\n速率限制通过4种方式衡量：并发、RPM（每分钟请求数）、TPM（每分钟 Token 数）、TPD（每天 Token 数）。速率限制可能会在任何一种选项中达到，取决于哪个先发生。例如，你可能向 ChatCompletions 发送了 20 个请求，每个请求只有 100 个 Token ，那么你就达到了限制（如果你的 RPM 限制是 20），即使你在这些 20 个请求中没有发满 200k 个 Token （假设你的TPM限制是 200k）。\\n对网关，出于方便考虑，我们会基于请求中的 max_tokens 参数来计算速率限制。这意味着，如果你的请求中包含了 max_tokens 参数，我们会使用这个参数来计算速率限制。如果你的请求中没有包含 max_tokens 参数，我们会使用默认的 max_tokens 参数来计算速率限制。当你发出请求后，我们会基于你请求的 token 数量加上你 max_tokens 参数的数量来判断你是否达到了速率限制。而不考虑实际生成的 token 数量。\\n而在计费环节中，我们会基于你请求的 token 数量加上实际生成的 token 数量来计算费用。\\n其他值得注意的重要事项：\\n\\n速率限制是在用户级别而非密钥级别上实施的。\\n目前我们在所有模型中共享速率限制。\\n\\n模型列表\\n你可以使用我们的 List Models API 来获取当前可用的模型列表。\\n当前的，我们支持的模型有：\\n\\nmoonshot-v1-8k: 它是一个长度为 8k 的模型，适用于生成短文本。\\nmoonshot-v1-32k: 它是一个长度为 32k 的模型，适用于生成长文本。\\nmoonshot-v1-128k: 它是一个长度为 128k 的模型，适用于生成超长文本。\\n\\n以上模型的区别在于它们的最大上下文长度，这个长度包括了输入消息和生成的输出，在效果上并没有什么区别。这个主要是为了方便用户选择合适的模型。\\n使用指南\\n获取 API 密钥\\n你需要一个 API 密钥来使用我们的服务。你可以在我们的控制台中创建一个 API 密钥。\\n发送请求\\n你可以使用我们的 Chat Completions API 来发送请求。你需要提供一个 API 密钥和一个模型名称。你可以选择是否使用默认的 max_tokens 参数，或者自定义 max_tokens 参数。可以参考 API 文档中的调用方法。\\n处理响应\\n通常的，我们会设置一个 5 分钟的超时时间。如果单个请求超过了这个时间，我们会返回一个 504 错误。如果你的请求超过了速率限制，我们会返回一个 429 错误。如果你的请求成功了，我们会返回一个 JSON 格式的响应。\\n如果是为了快速处理一些任务，你可以使用我们的 Chat Completions API 的非 streaming 模式。这种模式下，我们会在一次请求中返回所有的生成文本。如果你需要更多的控制，你可以使用 streaming 模式。在这种模式下，我们会返回一个 SSE 流，你可以在这个流中获取生成的文本，这样用户体验可能会更好，并且你也可以在任何时候中断请求，而不会浪费资源。\\n常见问题\\n如何充值？\\n\\n个人用户充值：请先进行个人认证，然后在用户充值页面进行在线充值，在线充值支持微信/支付宝扫码支付两种方式，充值成功后会按照您的累积充值金额进行用户等级调整；\\n企业用户充值：请先进行企业认证，企业认证通过后，平台会为您提供专属收款账号，请使用与实名认证主体一致的银行账户进行汇款。线下对公汇款预计1-5个工作日到账（具体到账时间以银行的实际到账时间为准），我方银行账户到账后，转账充值金额将在10分钟左右自动转入您的账户，充值成功后会按照您的累积充值金额进行用户等级调整。\\n\\n如何进行个人以及企业认证？\\n\\n个人：请登录我们的用户中心 (opens in a new tab)进行实名认证；\\n企业：请登录我们的用户中心 (opens in a new tab)进行企业认证，请提前准备企业相关信息（企业名称，与企业名称相同的银行账号，统一社会信用代码），平台会向您公司账户打款随机金额，用于验证企业信息。请联系贵公司财务确认并填入收款金额，金额匹配成功后，企业认证通过。\\n\\n如何开发票？\\n\\n平台支持按消耗金额或充值金额开具发票，请线上发起开票申请发票管理 (opens in a new tab)\\n个人认证可以开具公司抬头发票；企业认证可以开具企业认证主体抬头的发票\\n开票类型和税点：开票主体为北京月之暗面科技有限公司；信息技术服务类型；6% 含税\\n\\n每次接口调用都需要把对话历史发送是吧？这样的话是不是每次对话需要重复计费？\\n\\n根据 messages 的长度需要重新计费，用户可以调整每次发送对话历史的长度，只保留最重要的信息。\\n\\nAPI 文件解析的服务包含 OCR 吗？费用是怎样计算的？\\n\\n支持对 pdf 和图片文件的 OCR；文件解析服务限时免费，请求高峰期平台可能会有限流策略。\\n\\n是否有支持 Function Calling 的计划？\\n\\n已经支持，详情请见API 文档\\n\\n是否开放类似 Kimi 智能助手中的搜索接口？\\n\\n目前并没有开放搜索的计划，API 用户可以使用例如 Search2ai (opens in a new tab)、Apify (opens in a new tab)、Crawlbase (opens in a new tab) 或者 ArchiveBox (opens in a new tab) 等第三方解决方案。\\n\\n是否支持 LangChain？\\n\\n支持，用户可以参考这里的代码 (opens in a new tab)。\\n\\n我在调用接口的时候返回数据不完整，容易被截断怎么办？\\n\\n建议手工设置更大的 max_token，默认 max_token 为 1024。\\n\\n如何联系客服？\\n\\n请扫码添加客服企业微信 (opens in a new tab)\\n\\n指南\\n如何获得更好的输出？\\n\\nSystem Prompt最佳实践：system prompt（系统提示）指的是模型在生成文本或响应之前所接收的初始输入或指令，这个提示对于模型的运作至关重要 (opens in a new tab)\\n\\n编写清晰的说明\\n\\n为什么需要向模型输出清晰的说明？\\n\\n\\n模型无法读懂你的想法，如果输出内容太长，可要求模型简短回复。如果输出内容太简单，可要求模型进行专家级写作。如果你不喜欢输出的格式，请向模型展示你希望看到的格式。模型越少猜测你的需求，你越有可能得到满意的结果。\\n\\n在请求中包含更多细节，可以获得更相关的回答\\n\\n为了获得高度相关的输出，请保证在输入请求中提供所有重要细节和背景。\\n\\n一般的请求更好的请求如何在Excel中增加数字？我如何在Excel表对一行数字求和？我想自动为整张表的每一行进行求和，并将所有总计放在名为\"总数\"的最右列中。工作汇报总结将2023年工作记录总结为500字以内的段落。以序列形式列出每个月的工作亮点，并做出2023年全年工作总结。\\n在请求中要求模型扮演一个角色，可以获得更准确的输出\\n\\n在 API 请求的\\'messages\\' 字段中增加指定模型在回复中使用的角色。', metadata={'source': 'https://platform.moonshot.cn/docs/intro', 'title': 'Moonshot AI 开放平台', 'description': 'Moonshot AI 大模型开放平台，提供基于 Moonshot AI 大模型的长文本数据处理 API，开放平台支持灵活的 API 调用，带来领先的技术体验。', 'language': 'No language found.'}),\n",
      " Document(page_content='在 API 请求的\\'messages\\' 字段中增加指定模型在回复中使用的角色。\\n\\n{\\n  \"messages\": [\\n    {\"role\": \"system\", \"content\": \"你是 Kimi，由 Moonshot AI 提供的人工智能助手，你更擅长中文和英文的对话。你会为用户提供安全，有帮助，准确的回答。同时，你会拒绝一切涉及恐怖主义，种族歧视，黄色暴力等问题的回答。Moonshot AI 为专有名词，不可翻译成其他语言。\"},\\n    {\"role\": \"user\", \"content\": \"你好，我叫李雷，1+1等于多少？\"}\\n  ]\\n}\\n在请求中使用分隔符来明确指出输入的不同部分\\n\\n例如使用三重引号/XML标签/章节标题等定界符可以帮助区分需要不同处理的文本部分。\\n\\n{\\n  \"messages\": [\\n    {\"role\": \"system\", \"content\": \"你将收到两篇相同类别的文章，文章用XML标签分割。首先概括每篇文章的论点，然后指出哪篇文章提出了更好的论点，并解释原因。\"},\\n    {\"role\": \"user\", \"content\": \"<article>在这里插入文章</article><article>在这里插入文章</article>\"}\\n  ]\\n}\\n{\\n  \"messages\": [\\n    {\"role\": \"system\", \"content\": \"你将收到一篇论文的摘要和论文的题目。论文的题目应该让读者对论文主题有清晰的概念，同时也应该引人注目。如果你收到的标题不符合这些标准，请提出5个可选的替代方案\"},\\n    {\"role\": \"user\", \"content\": \"摘要:在这里插入摘要。\\\\n\\\\n标题:在这里插入标题\"}\\n  ]\\n}\\n明确完成任务所需的步骤\\n\\n任务建议明确一系列步骤。明确写出这些步骤可以使模型更容易遵循并获得更好的输出。\\n\\n{\\n  \"messages\": [\\n    {\"role\": \"system\", \"content\": \"使用以下步骤来回应用户输入。\\\\n步骤一：用户将用三重引号提供文本。用前缀“摘要：”将这段文本概括成一句话。\\\\n步骤二：将第一步的摘要翻译成英语，并加上前缀 \"Translation: \"。\"},\\n    {\"role\": \"user\", \"content\": \"\\\\\"\\\\\"\\\\\"在此处插入文本\\\\\"\\\\\"\\\\\"\"}\\n  ]\\n}\\n向模型提供输出示例\\n\\n向模型提供一般指导的示例描述，通常比展示任务的所有排列让模型的输出更加高效。例如，如果你打算让模型复制一种难以明确描述的风格，来回应用户查询。这被称为“few-shot”提示。\\n\\n{\\n  \"messages\": [\\n    {\"role\": \"system\", \"content\": \"以一致的风格回答\"},\\n    {\"role\": \"user\", \"content\": \"在此处插入文本\"}\\n  ]\\n}\\n指定期望模型输出的长度\\n\\n你可以要求模型生成特定目标长度的输出。目标输出长度可以用文数、句子数、段落数、项目符号等来指定。但请注意，指示模型生成特定数量的文字并不具有高精度。模型更擅长生成特定数量的段落或项目符号的输出。\\n\\n{\\n  \"messages\": [\\n    {\"role\": \"user\", \"content\": \"用两句话概括三引号内的文本，50字以内。\\\\\"\\\\\"\\\\\"在此处插入文本\\\\\"\\\\\"\\\\\"\"}\\n  ]\\n}\\n提供参考文本\\n指导模型使用参考文本来回答问题\\n\\n如果您可以提供一个包含与当前查询相关的可信信息的模型，那么就可以指导模型使用所提供的信息来回答问题\\n\\n{\\n  \"messages\": [\\n    {\"role\": \"system\", \"content\": \"使用提供的文章（用三引号分隔）回答问题。如果答案在文章中找不到，请写\"我找不到答案。\" \"},\\n    {\"role\": \"user\", \"content\": \"<请插入文章，每篇文章用三引号分隔>\"}\\n  ]\\n}\\n拆分复杂的任务\\n通过分类来识别用户查询相关的指令\\n\\n对于需要大量独立指令集来处理不同情况的任务来说，对查询类型进行分类，并使用该分类来明确需要哪些指令可能会帮助输出。\\n\\n# 根据客户查询的分类，可以提供一组更具体的指示给模型，以便它处理后续步骤。例如，假设客户需要“故障排除”方面的帮助。\\n{\\n  \"messages\": [\\n    {\"role\": \"system\", \"content\": \"你将收到需要技术支持的用户服务咨询。可以通过以下方式帮助用户：\\\\n\\\\n-请他们检查***是否配置完成。\\\\n如果所有***都配置完成，但问题依然存在，请询问他们使用的设备型号\\\\n-现在你需要告诉他们如何重启设备：\\\\n=设备型号是A，请操作***。\\\\n-如果设备型号是B，建议他们操作***。\"}\\n  ]\\n}\\n对于轮次较长的对话应用程序，总结或过滤之前的对话\\n\\n由于模型有固定的上下文长度显示，所以用户与模型助手之间的对话不能无限期地继续。\\n\\n针对这个问题，一种解决方案是总结对话中的前几个回合。一旦输入的大小达到预定的阈值，就会触发一个查询来总结先前的对话部分，先前对话的摘要同样可以作为系统消息的一部分包含在内。或者，整个对话过程中的先前对话可以被异步总结。\\n分块概括长文档，并递归构建完整摘要\\n\\n要总结一本书的内容，我们可以使用一系列的查询来总结文档的每个章节。部分摘要可以汇总并总结，产生摘要的摘要。这个过程可以递归进行，直到整本书都被总结完毕。如果需要使用前面的章节来理解后面的部分，那么可以在总结书中给定点的内容时，包括对给定点之前的章节的摘要。\\nChat', metadata={'source': 'https://platform.moonshot.cn/docs/intro', 'title': 'Moonshot AI 开放平台', 'description': 'Moonshot AI 大模型开放平台，提供基于 Moonshot AI 大模型的长文本数据处理 API，开放平台支持灵活的 API 调用，带来领先的技术体验。', 'language': 'No language found.'})]\n",
      "用户在Moonshot AI中充值，通常需要用户提供个人信息（如姓名、身份证号码等）、账户类型（如普通账户、储蓄账户等）以及金额。具体操作可能因平台和用户的使用习惯而有所不同。因此，在Moonshot AI中充值时，请务必仔细阅读并理解平台的规则和操作流程。\n"
     ]
    }
   ],
   "source": [
    "from langchain.chains import create_retrieval_chain\n",
    "\n",
    "retriever = vector.as_retriever()\n",
    "from pprint import pprint\n",
    "pprint(retriever.invoke(\"速率限制\"))\n",
    "\n",
    "resp = document_chain.invoke({\n",
    "    \"input\": \"Moonshot AI 开放平台如何充值\",\n",
    "    \"context\": retriever.invoke(\"如何充值\")\n",
    "})\n",
    "print(resp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "49940395-47a6-4b92-8954-0e82b4531f4d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "首先需要将长文档分为若干个相关的短篇文档。\n",
      "\n",
      "其次，在每个短篇文档中插入相应的关键词和引述。这样，就可以将整个文档通过这些关键词和引述进行分段。\n",
      "\n",
      "最后，将所有分段的文档按照原始排列顺序进行重新组合。这样，所有的文档都会按照原排序的顺序进行重新组合。\n",
      "\n",
      "总之，将长文档分为若干个相关的短篇文档，并将所有分段的文档按照原始排列顺序进行重新组合。这样，所有的文档都会按照原排序的顺序进行重新组合。\n"
     ]
    }
   ],
   "source": [
    "retrieval_chain = create_retrieval_chain(retriever, document_chain)\n",
    "response = retrieval_chain.invoke({\"input\": \"如何分块概括长文档，构建摘要\"})\n",
    "print(response[\"answer\"])\n",
    "\n",
    "# LangSmith offers several features that can help with testing:..."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
